#!/usr/bin/env node

// Node CLI 应用入口文件必须要有这样的文件头
// 如果是 Linux 或者 macOS 系统下还需要 修改此文件的读写权限为 755
// 具体就是通过 chmod 755 cli.js 实现修改

// 脚手架的工作过程：
// 1. 通过命令行交互询问用户问题
// 2. 根据用户回答的结果生成文件

const fs = require("fs");
const path = require("path");
const inquirer = require("inquirer");
const ejs = require("ejs");

// 将模板下的文件全部转换到目标目录
const readdir = (tmplDir, destDir, anwsers) => {
  // 先判断目标目录 是否存在该文件夹
  if (fs.existsSync(destDir)) {
    fs.readdir(tmplDir, (err, files) => {
      if (err) throw err;
      // files数组集合中是 tmplDir目录下的所有的文件名
      files.forEach((file) => {
        // file 为模板目录下的文件名， 即相对路径
        console.log('tmplDir../file', file);
  
        const filePath = `${tmplDir}/${file}`;
        const tarPath = `${destDir}/${file}`;
  
        // 加上父级路径 访问更深层的文件目录
        fs.stat(filePath, (err, dataFile) => {
          if (err) throw err;
  
          // 判断是否为文件夹
          if (dataFile.isDirectory()) {
            // 继续遍历该文件夹
            readdir(filePath, tarPath, anwsers);
          } else {
            // 通过模板引擎渲染文件
            ejs.renderFile(filePath, anwsers, (err, result) => {
              if (err) throw err;
  
              // 将结果写入目标文件路径 - result 就是文件经过模板引擎编译后的内容
              fs.writeFileSync(tarPath, result);
            });
          }
        });
  
      });
    });
  } else {
    // 创建文件夹
    fs.mkdir(destDir, (err) => {
      if (err) throw err;
      readdir(tmplDir, destDir, anwsers);
    });
  }
  
};

// 发起命令行询问
inquirer
  .prompt([
    {
      type: "input",
      name: "name",
      message: "Project name?",
    },
  ])
  .then((anwsers) => {
    // 根据用户回答的结果生成文件

    // 模板目录 - 即当前项目的模板目录
    const tmplDir = path.join(__dirname, "templates");
    // 目标目录 - 即命令行执行时 所在的目录，可通过 cwd 获取
    const destDir = process.cwd();

    // 将模板下的文件全部转换到目标目录
    readdir(tmplDir, destDir, anwsers);
  });

